package com.itheima.utils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ResourceBundle;

/**
 * Bean 对象 Factory 工厂 Utils 工具类
 *  负责程序中的对象创建
 */
public class  BeanFactoryUtils {

    /**
     * 问题:  类过多 if else就太多了->>> 抽
     * 1.在配置文件中声明 key和全限定类名的关系
     * 2.外部传入标识符
     * 3.方法的内部 根据标识符 找到对应的全限定类名
     * 4.实例化对象返回即可
     */
    public static Object getBean(String key){//外部传入的 routeService , categoryService
        Object proxyInstance=null;
        Object o = null;
        try {
            //1.加载配置文件 只能读取properties格式配置文件
            ResourceBundle bundle = ResourceBundle.getBundle("bean");
            //2.根据key获得全限定类名
            String className = bundle.getString(key);
            //3.反射实例化对象
            o = Class.forName(className).newInstance();
            //动态代理
            //参数一：类加载器  当前类
            //参二：被代理对象实现的接口数组  "myCar"对象
            //参三：处理器执行器 作用对被代理对象的方法增强
            Object finalO = o;
            proxyInstance = Proxy.newProxyInstance(BeanFactoryUtils.class.getClassLoader(), o.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    System.out.println(className+ "中的方法" + method.getName() + "时间" + System.currentTimeMillis());

                    Object invoke = method.invoke(finalO, args);


                    System.out.println(className + "中的方法" + method.getName() + "时间" + System.currentTimeMillis());

                    return invoke;

                }
            });

        } catch (Exception e) {
            e.printStackTrace();
        }
        return proxyInstance;
    }
}
